package br.ufmt.model;

import java.util.ArrayList;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import br.ufmt.exception.TabelaPrecoException;

/**
 * Classe utilizada para armazenar a tabela de pre�os.
 * O pre�o � formado pela composi��o de r�tulo e tipo de M�dia
 * @author jppreti
 *
 */
@ManagedBean
@SessionScoped
public class TabelaPreco {

	public static ArrayList<TabelaPreco> tabelaPreco = new ArrayList<TabelaPreco>();
	
	/**
	 * @see locadora.Rotulo
	 */
	private Rotulo rotulo;
	/**
	 * @see locadora.MidiaEnum
	 */
	private MidiaEnum tipoMidia;
	/**
	 * Representa o valor em R$ de um t�tulo de determinada m�dia e r�tulo
	 */
	private float preco;
	
	public TabelaPreco(Rotulo rotulo, MidiaEnum tipoMidia, float preco) throws TabelaPrecoException {
		setRotulo(rotulo);
		setTipoMidia(tipoMidia);
		setPreco(preco);
	}
	

	public Rotulo getRotulo() {
		return rotulo;
	}

	public MidiaEnum getTipoMidia() {
		return tipoMidia;
	}

	public float getPreco() {
		return preco;
	}

	/**
	 * Atribui um r�tulo a Tabela de Pre�o
	 * @param rotulo
	 * @throws TabelaPrecoException
	 */
	public void setRotulo(Rotulo rotulo) throws TabelaPrecoException {
		if (rotulo==null) throw new TabelaPrecoException(TabelaPrecoException.ROTULO_OBRIGATORIO);
		this.rotulo = rotulo;
	}
	
	/**
	 * Atribui um Tipo de M�dia a Tabela de Pre�o
	 * @param tipoMidia
	 * @throws TabelaPrecoException
	 */
	public void setTipoMidia(MidiaEnum tipoMidia) throws TabelaPrecoException {
		if (tipoMidia==null) throw new TabelaPrecoException(TabelaPrecoException.TIPO_MIDIA_OBRIGATORIO);
		this.tipoMidia = tipoMidia;
	}

	/**
	 * Define um pre�o para um tipo de m�dia de um determinado r�tulo.
	 * @param preco
	 * @throws TabelaPrecoException
	 */
	public void setPreco(float preco) throws TabelaPrecoException {
		if (preco<=0) throw new TabelaPrecoException(TabelaPrecoException.PRECO_INVALIDO);
		this.preco = preco;
	}
	
	/**
	 * Guarda uma refer�ncia do objeto em um vetor
	 */
	public void salvar() {
		if (!tabelaPreco.contains(this)) tabelaPreco.add(this);
	}
	
	/**
	 * Busca o valor da loca��o baseado na Rotulo da Obra e no Tipo de M�dia locada
	 * @param midia que est� sendo locada
	 * @return
	 */
	public static float getValorLocacao(Midia midia) {
		for (TabelaPreco tp : tabelaPreco) {
			if (midia.getObra().getRotulo().equals(tp.getRotulo()) &&
			    midia.getTipoMidia() == tp.getTipoMidia()) {
				return tp.getPreco();
			}
		}
		return 0;
	}
	
	
	public ArrayList<TabelaPreco> getTabelaPreco() {
		return tabelaPreco;
	}

	public void setTabelaPreco(ArrayList<TabelaPreco> tabelaPreco) {
		TabelaPreco.tabelaPreco = tabelaPreco;
	}


	static {
		try {
			new TabelaPreco(Rotulo.getRotuloPorNome("Super Lançamento"), MidiaEnum.BD, 7).salvar();
			new TabelaPreco(Rotulo.getRotuloPorNome("Super Lançamento"), MidiaEnum.DVD, 5).salvar();
			new TabelaPreco(Rotulo.getRotuloPorNome("Lançamento"), MidiaEnum.BD, 5).salvar();
			new TabelaPreco(Rotulo.getRotuloPorNome("Lançamento"), MidiaEnum.DVD, 3.5f).salvar();
			new TabelaPreco(Rotulo.getRotuloPorNome("Antigo"), MidiaEnum.BD, 3.5f).salvar();
			new TabelaPreco(Rotulo.getRotuloPorNome("Antigo"), MidiaEnum.DVD, 3).salvar();
		} catch (TabelaPrecoException e) {
			e.printStackTrace();
		}
	}	
}
